﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Entities;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
    public class GestorPaises
    {
        /// <summary>
        /// Permite obtener el pais segun su identificador
        /// </summary>
        /// <param name="OID">Identificador</param>
        /// <returns>Pais</returns>
        public static Pais Obtener(int OID)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PAISES_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", OID);
                DataTable dt = repo.ExecuteDataTable();
                Pais result = dt.ToGenericList<Pais>(PaisConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new PaisesGetException(ex);
            }
        }
        public static void Guardar(Pais pais)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "PAISES_PROC";
                repo.AddParameter("@ACCION", pais.Persistencia);
                repo.AddParameter("@ID", pais.OID);
                repo.AddParameter("@CODIGO", pais.Codigo);
                repo.AddParameter("@NUMERO", pais.Numero);
                repo.AddParameter("@NOMBRE", pais.Nombre);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                pais.OID = repo.ExecuteReturnValue().ToInteger();
                
                repo.Commit();
                GestorBitacora.Guardar(pais);

            }
            catch (Exception ex)
            {
                throw new PaisesSetException(ex);
            }
        }
        public static void Eliminar(Pais pais)
        {
            pais.Persistencia = EstadoPersistencia.DELETE;
            Guardar(pais);
            pais.Persistencia = EstadoPersistencia.UPDATE;
            pais.Activo = false;
        }
        public static void ReActivar(Pais pais)
        {
            pais.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(pais);
            pais.Persistencia = EstadoPersistencia.UPDATE;
            pais.Activo = true;
        }

        /// <summary>
        /// Permite consultar los paises
        /// </summary>
        /// <param name="codigo">Codigo, o parte de el, del pais a consultar</param>
        /// <param name="numero">Numero del pais a consultar</param>
        /// <param name="nombre">Nombre, o parte de el, del pais a consultar</param>
        /// <param name="activo">El estado de los paises a consultar</param>
        /// <returns>Todos los paises que coincidan con los filtros</returns>
        public static List<Pais> Consultar(string codigo, int? numero, string nombre, bool? activo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PAISES_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@CODIGO", codigo);
                repo.AddParameter("@NUMERO", numero);
                repo.AddParameter("@NOMBRE", nombre);
                repo.AddParameter("@ACTIVO", activo);
                DataTable dt = repo.ExecuteDataTable();
                List<Pais> result = dt.ToGenericList<Pais>(PaisConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new PaisesGetException(ex);
            }
        }

        /// <summary>
        /// Permite consultar los paises
        /// </summary>
        /// <returns>Todos los paises</returns>
        public static List<Pais> Consultar()
        {
            return Consultar(null, null, null, null);
        }

        /// <summary>
        /// Permite consultar los paises activos
        /// </summary>
        /// <param name="codigo">Codigo, o parte de el, del pais a consultar</param>
        /// <param name="nombre">Nombre, o parte de el, del pais a consultar</param>
        /// <returns>Todos los paises que coincidan con los filtros</returns>
        public static List<Pais> Consultar(string codigo, string nombre)
        {
            return Consultar(codigo, null, nombre, true);
        }

        /// <summary>
        /// Permite consultar los paises activos
        /// </summary>
        /// <param name="numero">Numero del pais a consultar</param>
        /// <returns>Todos los paises que coincidan con los filtros</returns>
        public static List<Pais> Consultar(int numero)
        {
            return Consultar(null, numero, null, null);
        }

        /// <summary>
        /// Permite consultar los paises segun su estado
        /// </summary>
        /// <param name="activo">El estado de los paises a consultar</param>
        /// <returns>Todos los paises segun el estado seleccionado</returns>
        public static List<Pais> Consultar(bool activo)
        {
            return Consultar(null, null, null, activo);
        }

        #region Converter
        public static Pais PaisConverter(DataRow row)
        {
            return new Pais
            {
                Persistencia = EstadoPersistencia.UPDATE,
                OID = row["paisID"].ToInteger(),
                Codigo = row["paisCODIGO"].ToString(),
                Numero = row["paisNUMERO"].ToInteger(),
                Nombre = row["paisNOMBRE"].ToString(),
                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };
        }
        #endregion


       
    }
}
